package utils
{
	import flash.display.*;
	import flash.geom.*;
	import flash.utils.*;
	
	/**
	 * 帮助类, 转换资源到可用的对象
	 */
	public class Cast
	{
		
///////////////////////////////////////////////////////////////////////////////////////////////////
// 静态公共域
///////////////////////////////////////////////////////////////////////////////////////////////////
		
		/**
		 * 转换为 String 对象
		 */
		public static function string(data : *) : String
		{
			if (data is Class)
				data = new data();
			
			if (data is String)
				return data;
			
			return String(data);
		}
		
		/**
		 * 转换为 ByteArray 对象
		 */
		public static function bytearray(data : *) : ByteArray
		{
			if (data is Class)
				data = new data();
			
			if (data is ByteArray)
				return data;
			
			return ByteArray(data);
		}
		
		/**
		 * 转换为 XML 对象
		 */
		public static function xml(data : *) : XML
		{
			if (data is Class)
				data = new data();
			
			if (data is XML)
				return data;
			
			return XML(data);
		}
		
		/**
		 * 转换为表示颜色的 uint 对象
		 */
		public static function color(data : *) : uint
		{
			if (data is uint)
				return data as uint;
			
			if (data is int)
				return data as uint;
			
			if (data is String)
			{
				if (data == "random")
					return uint(Math.random() * 0x1000000);
				
				if (((data as String).length == 6) && hexstring(data))
					return parseInt("0x" + data);
			}
			
			return 0xFFFFFF;
		}
		
		/**
		 * 转换为 BitmapData 对象
		 */
		public static function bitmap(data : *) : BitmapData
		{
			if (data == null)
				return null;
			
			if (data is String)
				data = tryclass(data);
			
			if (data is Class)
			{
				try
				{
					data = new data();
				}
				catch (bitmaperror : ArgumentError)
				{
					data = new data(0, 0);
				}
			}
			
			if (data is BitmapData)
				return data;
			
			if (data is Bitmap)
				if ((data as Bitmap).hasOwnProperty("bitmapData")) // if (data is BitmapAsset)
					return (data as Bitmap).bitmapData;
			
			if (data is DisplayObject)
			{
				var ds : DisplayObject = data as DisplayObject;
				var bmd : BitmapData = new BitmapData(ds.width, ds.height, true, 0x00FFFFFF);
				var mat : Matrix = ds.transform.matrix.clone();
				
				// 保证没有平移 (0, 0)
				mat.tx = 0;
				mat.ty = 0;
				
				// 保存显示对象的 colortransform, blendMode 属性
				bmd.draw(ds, mat, ds.transform.colorTransform, ds.blendMode, bmd.rect, true);
				return bmd;
			}
			
			throw new Error("Can't cast to bitmap: " + data);
		}
		
///////////////////////////////////////////////////////////////////////////////////////////////////
// 静态私有域
///////////////////////////////////////////////////////////////////////////////////////////////////
		
		/**
		 * 检测是否存在 name 指定的类对象.
		 * @param	name 类的名称.
		 * @return 如果存在则返回 name 指定的类对象, 否则返回 name .
		 */
		private static function tryclass(name : String) : Object
		{
			if (notclasses[name])
				return name;
			
			var result : Class = classes[name];
			
			if (result != null)
				return result;
			
			try
			{
				result = getDefinitionByName(name) as Class;
				classes[name] = result;
				return result;
			}
			catch (error : ReferenceError)
			{
			}
			
			notclasses[name] = true;
			return name;
		}
		
		/**
		 * 检测 string 是否含有所有十六进制字符.
		 * @param	string 检测字符.
		 * @return string 含有所有十六进制字符返回 true, 否则返回 false.
		 */ 
		private static function hexstring(string : String) : Boolean
		{
			var _length : int = string.length;
			for (var i : int = 0; i < _length; ++i)
				if (hexchars.indexOf(string.charAt(i)) == -1)
					return false;
			
			return true;
		}
		
		/// 十六进制字符
		private static var hexchars		: String = "0123456789abcdefABCDEF";
		
		/// 保存非 Class 类型对象
		private static var notclasses	: Dictionary = new Dictionary();
		
		/// 保存 Class 类型对象
		private static var classes		: Dictionary = new Dictionary();
		
	}
}



































///////////////////////////////////////////////////////////////////////////////////////////////////
// end file
///////////////////////////////////////////////////////////////////////////////////////////////////


